#pragma once

#include "noncopyable.h"

class InetAddress;


/**
 * 封装socket fd
 * Socket 类是对底层套接字（socket）的封装，提供了对套接字操作的高级接口。
 * 它隐藏了底层的系统调用细节，使得套接字的使用更加方便和安全
 */
class Socket : noncopyable
{
public:
    //接受一个套接字文件描述符（sockfd），并将其存储为成员变量
    explicit Socket(int sockfd)
        : sockfd_(sockfd)
    {
    }
    ~Socket();

    int fd() const { return sockfd_; }
    void bindAddress(const InetAddress &localaddr);
    void listen();
    int accept(InetAddress *peeraddr);

    void shutdownWrite();

    void setTcpNoDelay(bool on);
    void setReuseAddr(bool on);
    void setReusePort(bool on);
    void setKeepAlive(bool on);

private:
    const int sockfd_;
};
